/**********************************************************************************
 *
 *	函数名称：FindFile
 * 	文件作用：运行函数时输入一个指定文件夹路径径，函数查找该路径下的所有文件,
 *   如果是bmp或者jpg格或者是txt格式则存储到链表节点去，
 * 	文件作者：WSY
 * 	�?改日期：2023.12.23
 *  	注意事项:注意节点和节点的链接
 *  * 	�?改日期：2023.12.31
 *  	注意事项:注意节点和节点的链接以及链表格式之间的判断
 *
 *	版权声明：CopyRight (c)  @cecelmx.126.com  All Right Reserved
 * ********************************************************************************/

#include "head.h"
#include "node.h"

/// @brief 调用后，可将传入的文件路径下得文件名字串联成指定数据格式的双向循环链表
/// @param filePath 待查找的文件夹路径 
/// @param head 待链接的链表头
/// @return 指定定文件的数量
int FindFile(const char *fileImgPath, void *head)
{
    /* 调用 opendir 函数打开指定文件夹 */
    DIR *dir = opendir(fileImgPath);
    if (dir == NULL)
    {
        printf("打开文件夹失败！\n");
        return -1;
    }

    /* 定义数量变量存储找到的指定文件数量?*/
    int Num = 0;

    /* chdir，进入到输入的文件路径，方便验证�?否成功输出所有文件名 */
    if (chdir(fileImgPath) < 0)
    {
        printf("跳转失败！\n");
        closedir(dir);
        return -1;
    }

    /* 通过 readdir 函数读取文件目录项入口，并循环读取文件信息添加至链表 */
    struct dirent *entry = readdir(dir);
    struct stat statBuffer;

    while (entry != NULL)
    {
        /* 拼接文件夹径和文件名 */
        char filePath[320];
        sprintf(filePath, "%s/%s", fileImgPath, entry->d_name);

        /* 使用 stat 函数获取文件信息，输出其类型 */
        int statResult = stat(filePath, &statBuffer);
        if (statResult < 0)
        {
            printf("文件路径有误?，请重新输入！\n");
            closedir(dir);
            return -1;
        }

        /* 将存储指定文件信息的结构体里面的类型成员拿出来比较 */
        /* 如果是常规文件，并且后缀是jpg 或 bmp 格式则将文件名和路径名输出和存储到链表 */
        if (S_ISREG(statBuffer.st_mode))
        {
            int nameLength = strlen(entry->d_name);
            if (nameLength > 3 && (strcmp(entry->d_name + nameLength - 3, "bmp") == 0))
            {
                // printf("当前收到文件路径为:%s,\n",filePath);

                /*新建数据域对象并将文件名和类型存入其中*/
                DataType newdata = GetNewData(filePath, 'b');
                /*新建数据域对象并将文件名和类型存入其中*/

                P_Node newnode = NewNode(&newdata); /*新建节点对象并将数据域对象存入其中*/

                Add2ListOrder((P_Node)head, newnode);

                Num++;
            }
            else if (nameLength > 3 && (strcmp(entry->d_name + nameLength - 3, "jpg") == 0))
            {
                // printf("当前收到文件路径为:%s,\n",filePath);

                /*新建数据域对象并将文件名和类型存入其中*/
                DataType newdata = GetNewData(filePath, 'j');
                /*新建数据域对象并将文件名和类型存入其中*/

                P_Node newnode = NewNode(&newdata); /*新建节点对象并将数据域对象存入其中*/

                Add2ListOrder((P_Node)head, newnode);

                Num++;
            }
            else if (nameLength > 3 && (strcmp(entry->d_name + nameLength - 3, "txt") == 0))
            {
                // printf("当前收到文件路径为:%s,\n",filePath);

                /*新建数据域对象并将文件名和类型存入其中*/
                UserDataType newUserData = GetNewUserData(filePath);
                /*新建数据域对象并将文件名和类型存入其中*/

                P_UserNode newUserNode = NewUserNode(&newUserData); /*新建节点对象并将数据域对象存入其中*/

                Add2UserHead((P_UserNode)head, newUserNode);  /*将*/

                Num++;
            }
        }

        /* 重新赋读取文件目录项 entry */
        entry = readdir(dir);
    }

    // 关闭文件夹
    closedir(dir);
    return Num;
}